package com.caineng.zhaobiao.zbapi.utils;

import cn.hutool.core.util.ArrayUtil;
import com.caineng.zhaobiao.zbapi.utils.config.ConfigYml;
import lombok.extern.slf4j.Slf4j;
import org.lionsoul.jcseg.ISegment;
import org.lionsoul.jcseg.IWord;
import org.lionsoul.jcseg.dic.ADictionary;
import org.lionsoul.jcseg.dic.DictionaryFactory;
import org.lionsoul.jcseg.extractor.impl.TextRankKeyphraseExtractor;
import org.lionsoul.jcseg.extractor.impl.TextRankKeywordsExtractor;
import org.lionsoul.jcseg.segmenter.SegmenterConfig;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

/**
 * 中文分词
 * @author liandyao
 * @date 2021/12/10 19:16
 */
@Slf4j
public  class ChineseSegment {
    static  ISegment seg=null;

    /**
     * 初始化
     */
    public static synchronized void init(){
        seg=null;
        SegmenterConfig config = new SegmenterConfig(true);
        String lexicon[] = {ConfigYml.lexiconPath};
        log.info("==================>"+ConfigYml.lexiconPath);
        config.setLexiconPath(lexicon);

        //String lexicon[] = {"e://lexicon"};
        //config.setLexiconPath(lexicon);
        ADictionary dic = DictionaryFactory.createSingletonDictionary(config);

        seg = ISegment.COMPLEX.factory.create(config, dic);

    }

    static{
        init();
    }

    /**
     * 取地方分词结果
     * @param str
     * @return
     */
    public static synchronized List<String> segmentAddress(String str){

        List<String> list = new ArrayList<>();
        try {

            seg.reset(new StringReader(str));

            //System.out.println("====>"+str+"  ==> "+seg);
            //获取分词结果
            IWord word = null;
            while ( (word = seg.next()) != null ) {
                //1 普通词语
                if(word.getType()==1){
                    //17表示数字
                    if(word.getType()==17 || word.getPartSpeech()==null) {
                        continue;
                    }
                    //处所词
                    if(ArrayUtil.contains(word.getPartSpeech(),"ns")){
                        list.add(word.getValue());
                        log.info("分词结果"+word.getValue());
                    }
                }
            }
        } catch (Exception e) {
            init();
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 分析工种分词结果
     * @param str
     * @return
     */
    public static synchronized List<String> segmentCaitype(String str){
        List<String> list = new ArrayList<>();
        try {
            seg.reset(new StringReader(str));
            //获取分词结果
            IWord word = null;
            while ( (word = seg.next()) != null ) {

                //1 普通词语
                if(word.getType()==1){
                    //17表示数字
                    if(word.getType()==17 || word.getPartSpeech()==null) {
                        continue;
                    }
                    //才能网工种分词
                    if(ArrayUtil.contains(word.getPartSpeech(),"ncn")){
                        list.add(word.getValue());
                        log.info("分词结果"+word.getValue());
                    }
                }

            }
        } catch (IOException e) {
            init();
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 综合分词
     * @param str
     * @return
     */
    public static synchronized List<String> segment(String str){
        List<String> list = new ArrayList<>();
        try {
            seg.reset(new StringReader(str));
            //获取分词结果
            IWord word = null;
            while ( (word = seg.next()) != null ) {
                /**


                 名词n、时间词t、处所词s、方位词f、数词m、量词q、区别词b、代词r、动词v、形容词a、状态词z、副词d、
                 介词p、连词c、助词u、语气词y、叹词e、拟声词o、成语i、习惯用语l、简称j、前接成分h、后接成分k、语素g、非语素字x、标点符号w）外，
                 从语料库应用的角度，增加了专有名词（人名nr、地名ns、机构名称nt、其他专有名词nz）



                 */
                //1 普通词语
                if(word.getType()==1){
                    //17表示数字
                    if(word.getType()==17 || word.getPartSpeech()==null) {
                        continue;
                    }
                    /*

                    //才能网工种分词
                    if(ArrayUtil.contains(word.getPartSpeech(),"ncn")){
                        list.add(word.getValue());
                        log.info("分词结果"+word.getValue());
                    }
                    //处所词
                    if(ArrayUtil.contains(word.getPartSpeech(),"ns")){
                        list.add(word.getValue());
                        log.info("分词结果"+word.getValue());
                    }

                    */

                    if(word.getValue().length()>=2){
                        list.add(word.getValue());
                    }

                }

            }
        } catch (IOException e) {
            init();
            e.printStackTrace();
        }
        return list;
    }

    public static void main(String[] args) {
        //设置要分词的内容
        String str = "[信丰县]信丰县桃江、西江河两岸配套排水设施改造工程设计、采购、施工总承包（EPC）";

            int i = 0 ;

        List<String> keywords = segment(str);

        keywords.forEach(str1 -> {
            System.out.println(str1);
        });


    }


    public void test1() throws IOException {
        String str = "才能网湖南长沙市长期招工信息:招2个砌筑工维修师傅，少数民族勿扰，1个力工，电话微信同步，活在济南，13262981930";
        str="";
        //2, 构建TextRankKeywordsExtractor关键字提取器
        TextRankKeywordsExtractor extractor = new TextRankKeywordsExtractor(seg);
        //extractor.setMaxIterateNum(100);        //设置pagerank算法最大迭代次数，非必须，使用默认即可
        //extractor.setWindowSize(5);             //设置textRank计算窗口大小，非必须，使用默认即可
       // extractor.setKeywordsNum(10);           //设置最大返回的关键词个数，默认为10
        List<String> keywords = extractor.getKeywords(new StringReader(str));
        keywords.forEach(str2 -> System.out.println(str2));
    }




    public void test2() throws IOException {
       // String str = "才能网湖南长沙市长期招工信息:招2个砌筑工维修师傅，少数民族勿扰，1个力工，电话微信同步，活在济南，13262981930";



//2, 构建TextRankKeyphraseExtractor关键短语提取器
        TextRankKeyphraseExtractor extractor = new TextRankKeyphraseExtractor(seg);
        extractor.setMaxIterateNum(100);        //设置pagerank算法最大迭代词库，非必须，使用默认即可
        extractor.setWindowSize(5);             //设置textRank窗口大小，非必须，使用默认即可
        extractor.setKeywordsNum(15);           //设置最大返回的关键词个数，默认为10
        extractor.setMaxWordsNum(4);            //设置最大短语词长，默认为5

//3, 从一个输入reader输入流中获取短语
        String str = "支持向量机广泛应用于文本挖掘，例如，基于支持向量机的文本自动分类技术研究一文中很详细的介绍支持向量机的算法细节，文本自动分类是文本挖掘技术中的一种！";
        List<String> keyphrases = extractor.getKeyphrase(new StringReader(str));
        keyphrases.forEach(str2 -> System.out.println(str2));
    }
}
